package com.AdvancedDemos.LearnThread多线程;

import java.util.Random;
import java.util.concurrent.*;

public class 线程池执行带返回值的类型 {
    /*
     * 线程池执行带返回值的任务
     *
     * Callable:
     * 相当于之前的Runnable，是线程执行目标类，该类中call方法相当于之前的run方法，是线程要执行的方法
     * 区别是call是带返回值的，即线程执行结束后，会生成一个结果
     *
     * Future:
     * Callable中call方法的返回值类型，预期结果类型。其中包含着最终的返回值。
     * 最终有方法 V get() 用于得到真正的返回结果
     *
     * Callable类的泛型就是方法的返回值类型
     */
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建有3个线程的线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(3);

        //交给线程池任务并执行
        Callable<String> callable = new Callable<String>() {
            @Override
            public String call() throws Exception {
                String name = Thread.currentThread().getName();
                System.out.println("线程:" + name + "执行了!");
                return "haha" + new Random().nextInt(100);
            }
        };

        //调用线程池,执行一个带返回值的方法
        Future<String> result1 = threadPool.submit(callable);//线程:pool-1-thread-1执行了!
        System.out.println(result1.get());//haha82

        Future<String> result2 = threadPool.submit(callable);//线程:pool-1-thread-2执行了!
        System.out.println(result2.get());//haha12

        //关闭线程池
        threadPool.shutdown();
    }
}
